package com.knowledge.plus.多态;

/**
 * 当使用多态方式调用方法时，首先检查父类中是否有该方法，
 * 如果没有，则编译错误；如果有，再去调用子类的同名方法。
 *
 * @author TPF
 * @since 2025/6/11
 */
class Demo {
    public static void main(String[] args) {
        Animal myPet = new Dog();  // 3. 父类引用指向子类对象
        myPet.speak();  // 输出 "Woof!"（实际调用子类方法）

        Animal myNewPet = new Cat();
        myNewPet.speak();   // 输出 "Meow!"
    }
}

/**
 * 父类
 */
class Animal {
    void speak() {
        System.out.println("Animal sound");
    }
}

/**
 * 子类1
 */
class Dog extends Animal {  // 1. 继承
    @Override   // 2. 重写父类方法
    void speak() {
        System.out.println("Woof!");
    }
}

/**
 * 子类2
 */
class Cat extends Animal {
    @Override
    void speak() { System.out.println("Meow!"); }
}